package com.zhuiyun.project.utils;

import lombok.extern.slf4j.Slf4j;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 时间处理工具类
 * @auther zcy
 * @data 2020/7/7 12:10
 */
@Slf4j
public class DateTimeUtils {

    private static Map<String, DateFormat> formatMap = new HashMap<>();

    /***
     * 获取当前时间的毫秒数,是自1970-1-01 00:00:00.000 到当前时刻的时间距离
     * 如:1445090702909
     * 多线程,有很多重复值
     * @return 返回类型为String
     */
    public static String getCurrentTimeMillis() {
        return String.valueOf(System.currentTimeMillis());
    }

    /***
     * 获取当前时间的纳秒,1ms=1000000ns
     * 精准1000000倍的取纳秒的方法
     * 多线程,基本无重复值
     * @return
     */
    public static String getNanoTime() {
        return String.valueOf(System.nanoTime());
    }

    /***
     * 返回当前年，如：2020
     * @return
     */
    public static String getCurrentYear() {
        Calendar calendar = Calendar.getInstance();
        return String.valueOf(calendar.get(Calendar.YEAR));
    }

    /***
     * 返回当前月,如：07
     * @return
     */
    public static String getCurrentMonth() {
        Calendar calendar = Calendar.getInstance();
        String month = String.valueOf(calendar.get(Calendar.MONTH) + 1);
        if (month.length() == 1) {
            return "0" + month;
        }
        return month;
    }

    /***
     * 返回当前日,如：26
     * @return
     */
    public static String getCurrentDayOfMonth() {
        Calendar calendar = Calendar.getInstance();
        return String.valueOf(calendar.get(Calendar.DAY_OF_MONTH));
    }

    private static DateFormat getDateFormat(String pattern) {
        DateFormat format = formatMap.get(pattern);
        if (format == null) {
            format = new SimpleDateFormat(pattern);
            formatMap.put(pattern, format);
        }
        return format;
    }

    /**
     * 把时间字符串转换成指定格式的时间
     *
     * @param pattern
     * @param dateString
     * @return Date
     */
    public static Date parse(String pattern, String dateString) {
        try {
            DateFormat format = getDateFormat(pattern);
            return format.parse(dateString);
        } catch (ParseException e) {
            log.error("时间解析错误 ", e);
            return null;
        }
    }

    /**
     * 把时间转换成指定格式的时间字符串
     *
     * @param pattern
     * @param date
     * @return String
     */
    public static String format(String pattern, Date date) {
        DateFormat format = getDateFormat(pattern);
        return format.format(date);
    }

    public static Date stringConvertDate(String dateString) {
        return parse("yyyy-MM-dd HH:mm:ss", dateString);
    }

    public static Date stringConvertDate(String dateString, String pattern) {
        return parse(pattern, dateString);
    }

    public static Date convertDate(Date date, String p) {
        SimpleDateFormat sdf = new SimpleDateFormat(p);
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            return sdf2.parse(sdf.format(date));
        } catch (ParseException e) {
            log.error("DatetimeUtil.convertDate:" + e.getMessage());
            return null;
        }
    }

    /***
     * 返回当前时间，如：2015-01
     * @return
     */
    public static String getDateTime() {
        Calendar calendar = Calendar.getInstance();
        String year = String.valueOf(calendar.get(Calendar.YEAR));
        String month = String.valueOf(calendar.get(Calendar.MONTH) + 1);
        if (month.length() == 1) {
            month = "0" + month;
        }
        String datetime = year + "-" + month;
        return datetime;
    }

    /***
     * 返回当前时间的前一月份，如：2015-01前一月份是2014-12
     * @return
     */
    public static String getMonthAgo() {
        Calendar calendar = Calendar.getInstance();
        String year = String.valueOf(calendar.get(Calendar.YEAR));
        String month = String.valueOf(calendar.get(Calendar.MONTH) + 1);
        if (month.equals("1")) {
            year = String.valueOf(calendar.get(Calendar.YEAR) - 1);
            month = "12";
        } else {
            month = String.valueOf(calendar.get(Calendar.MONTH));
        }
        if (month.length() == 1) {
            month = "0" + month;
        }
        String datetime = year + "-" + month;
        return datetime;
    }

    /***
     * 返回当前时间的前年，如：2015前一年是2014
     * @return
     */
    public static String getYearAgo() {
        Calendar calendar = Calendar.getInstance();
        String year = String.valueOf(calendar.get(Calendar.YEAR) - 1);
        return year;
    }

    /***
     * 返回查询时间
     * @return
     */
    static Calendar c = Calendar.getInstance();
    // 获取当前月
    final int month = c.get(Calendar.MONTH) + 1;

    public int getmonth() {
        return month;
    }

    // 获取到当前年
    final int year = c.get(Calendar.YEAR);

    public int getYear() {
        return year;
    }

    // 获取上一个季度
    public int getCurrentQuarger() {
        if (month >= 1 && month <= 3) return 4;
        if (month >= 4 && month <= 6) return 1;
        if (month >= 7 && month <= 9) return 2;
        return 3;
    }

    // 获取上一个月
    public int getCurrentMonthAgo() {
        if (month == 1) {
            return 12;
        }
        int currentMonth = month - 1;
        return currentMonth;
    }

    // 获取上一年
    public int getCurrentYearAgo() {
        return year - 1;
    }

    // 判断当前月分是否用生成季度报表
    public boolean isCreateQuarter() {
        if (month == 1 || month == 4 || month == 7 || month == 10) {
            return true;
        }
        return false;
    }

    // 获取季报表查询开始时间
    public String getQuarterBegin() {
        String date = null;
        String monthTemps = String.valueOf(month);
        int yearTemp = year;
        if (month == 1) {
            monthTemps = "10";
            yearTemp = year - 1;
        } else {
            monthTemps = "0" + (month - 3);
        }
        if (this.isCreateQuarter()) {
            date = yearTemp + "-" + monthTemps + "-" + "01" + " 00:00:00";
        }
        return date;
    }

    // 获取到即报表上上季度开始时间
    public String getQuarerLastBengin() {
        String date = null;
        String monthTemps = String.valueOf(month);
        int yearTemp = year;
        if (month == 1) {
            monthTemps = "07";
            yearTemp = year - 1;
        } else if (month == 4) {
            monthTemps = "10";
            yearTemp = year - 1;
        } else {
            monthTemps = "0" + (month - 6);
        }

        if (this.isCreateQuarter()) {
            date = yearTemp + "-" + monthTemps + "-" + "01" + " 00:00:00";
        }
        return date;
    }

    // 获取季报表查询结束时间
    public String getQuarterEnd() {
        String date = null;
        String monthTemps = String.valueOf(month);
        if (month < 10) monthTemps = "0" + monthTemps;
        if (this.isCreateQuarter()) {
            date = year + "-" + monthTemps + "-" + "01" + " 00:00:00";
        }
        return date;
    }

    // 获取到即报表上上季度结束时间
    public String getQuarerLastEnd() {
        String date = null;
        String monthTemps = String.valueOf(month);
        int yearTemp = year;
        if (month == 1) {
            monthTemps = "10";
            yearTemp = year - 1;
        } else if (month == 4) {
            monthTemps = "01";
        } else {
            monthTemps = "0" + (month - 3);
        }
        if (this.isCreateQuarter()) {
            date = yearTemp + "-" + monthTemps + "-" + "01" + " 00:00:00";
        }
        return date;
    }

    // 获取月报表查询开始时间
    public String getMonthBegin() {
        String date = null;
        String monthTemps = String.valueOf(month);
        int yearTemp = year;
        if (month == 1) {
            monthTemps = "12";
            yearTemp = year - 1;
        } else if (month < 11) {
            monthTemps = "0" + (month - 1);
        }
        date = yearTemp + "-" + monthTemps + "-" + "01" + " 00:00:00";
        return date;
    }

    // 获取上上月报表查询开始时间
    public String getMonthLastBegin() {
        String date = null;
        String monthTemps = String.valueOf(month);
        int yearTemp = year;
        if (month == 1) {
            monthTemps = "11";
            yearTemp = year - 1;
        } else if (month == 2) {
            monthTemps = "12";
            yearTemp = year - 1;
        } else if (month < 12) {
            monthTemps = "0" + (month - 2);
        } else {
            monthTemps = String.valueOf(month - 1);
        }
        date = yearTemp + "-" + monthTemps + "-" + "01" + " 00:00:00";
        return date;
    }

    // 获取月报表查询结束时间
    public String getMonthEnd() {
        String date = null;
        String monthTemps = String.valueOf(month);
        if (month < 10) {
            monthTemps = "0" + month;
        }
        date = year + "-" + monthTemps + "-" + "01" + " 00:00:00";
        return date;
    }

    // 获取上上月报表查询结束时间
    public String getMonthLastEnd() {
        String date = null;
        String monthTemps = String.valueOf(month);
        int yearTemp = year;
        if (month == 1) {
            monthTemps = "12";
            yearTemp = year - 1;
        }
        if (month < 11) {
            monthTemps = "0" + (month - 1);
        } else {
            monthTemps = String.valueOf(month - 1);
        }
        date = yearTemp + "-" + monthTemps + "-" + "01" + " 00:00:00";
        return date;
    }

    //获取上个月的最后一天
    public static String getMonthLastDay() {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        cal.set(Calendar.DAY_OF_MONTH, 1);
        cal.add(Calendar.DATE, -1);
        String data = df.format(cal.getTime());
        return data;

    }

    //获取本月的最后一天
    public String getThisMonthLastDay() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Calendar ca = Calendar.getInstance();
        ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
        String last = format.format(ca.getTime());
        return last;
    }

    //获取某月有几天
    public static Integer getThisMonthDay(String pTime) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Calendar c = Calendar.getInstance();
        try {
            c.setTime(format.parse(pTime));
        } catch (ParseException e) {
            log.error("DatetimeUtil.getThisMonthDay:" + e.getMessage());
        }
        System.out.println("------------" + c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH) + 1) + "月的天数和周数-------------");
        return c.getActualMaximum(Calendar.DAY_OF_MONTH);
    }

    //获取上个月的第一天
    public static String getMonthFirstDay() {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        cal.add(Calendar.MONTH, -1);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        String data = df.format(cal.getTime());
        return data;
    }

    //获取本月的第一天
    public String getThisMonthFirstDay() {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        cal.add(Calendar.MONTH, 0);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        String data = df.format(cal.getTime());
        return data;
    }

    // 获取月报表名字前缀
    public String getMonthName() {
        int yearTemp = year;
        if (month == 1) {
            yearTemp = this.getCurrentYearAgo();
        }
        return yearTemp + "-" + this.getCurrentMonthAgo();
    }

    // 获取季报表名字前缀
    public String getQuarterName() {
        int yearTemp = year;
        if (month == 1) {
            yearTemp = this.getCurrentYearAgo();
        }
        return yearTemp + "第" + this.getCurrentQuarger() + "季度";
    }

    //获取当前日期是周几
    public static int getDay() {
        int getWeek = c.get(Calendar.DAY_OF_WEEK);
        if (getWeek == 1) {
            return 7;
        } else {
            return getWeek - 1;
        }
    }

    // 获取到本周周一//此数据不稳定请勿用
    public String getMonday() {

        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); // 获取本周一的日期
        cal.add(Calendar.WEEK_OF_YEAR, 0);
        String data = df.format(cal.getTime());
        return data;
    }

    // 获取到本周周一//获取本周周一请用此方法
    public String getMondaytoday() {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Calendar c = Calendar.getInstance();
        c.setTime(new Date());
        int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1;
        if (day_of_week == 0) {
            day_of_week = 7;
        }
        c.add(Calendar.DATE, -day_of_week + 1);
        c.add(Calendar.WEEK_OF_YEAR, 0);
        String data = df.format(c.getTime());
        return data;
    }

    //获取本周周日
    public String getMondaySumDay() {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Calendar c = Calendar.getInstance();
        c.setTime(new Date());
        int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1;
        if (day_of_week == 0) {
            day_of_week = 7;
        }
        c.add(Calendar.DATE, -day_of_week + 1);
        c.add(Calendar.WEEK_OF_YEAR, 0);
        c.add(Calendar.DAY_OF_YEAR, 6);
        String data = df.format(c.getTime());
        System.out.print(data);
        return data;
    }

    // 获取到上个周周一
    public String getMondayLast() {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); // 获取本周一的日期
        cal.add(Calendar.WEEK_OF_YEAR, -1);
        String data = df.format(cal.getTime());
        return data;
    }


    //获取三个周前的周一
    public String getMondayThree() {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); // 获取本周一的日期
        cal.add(Calendar.WEEK_OF_YEAR, -3);
        String data = df.format(cal.getTime());
        return data;
    }

    // 获取到上个周周天
    public String getLastSum() {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); // 获取本周一的日期
        cal.add(Calendar.WEEK_OF_YEAR, -1);
        cal.add(Calendar.DATE, +6);
        String data = df.format(cal.getTime());
        return data;
    }

    //获取周报名字
    public String getMondayName() {
        return getMondayLast() + "到" + getMonday();
    }

    //获取两分钟前
    public String getLastMinute() {
        SimpleDateFormat time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MINUTE, -15);//15分钟前
        String data = time.format(cal.getTime());
        return data;
    }

    //获取当前时间
    public String getMinute() {
        SimpleDateFormat time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Calendar cal = Calendar.getInstance();
        String data = time.format(cal.getTime());
        return data;
    }

    public String getMinutes() {
        SimpleDateFormat time = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        String data = time.format(cal.getTime());
        return data;
    }

    //获取上一天
    public static String getLastDay() {
        SimpleDateFormat time = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -1);//获取一天前
        String data = time.format(cal.getTime());
        return data;
    }

    //获取七天前日期
    public static String getLastweek() {
        SimpleDateFormat time = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -7);//7前
        String data = time.format(cal.getTime());
        return data;
    }

    // 获取到七个周前周一
    public String getMondayLastSeven() {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); //
        c.add(Calendar.WEEK_OF_YEAR, -7);
        String data = df.format(c.getTime());
        return data;
    }

    // 获取到半年前时间
    public String getSexMonth() {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, Calendar.MONDAY - 6, Calendar.DATE);
        String data = df.format(cal.getTime());
        return data;
    }

    /**
     * @Title getViewTime
     * @author lize16713
     * @Description 获取年数
     */
    public static String getViewTime(Long ms) {
        double yesr = ms / (1000.0 * 60.0 * 60.0 * 24.0 * 30.0 * 12.0);
        String time = String.format("%.1f", yesr);

        if (time.contains("-")) {
            return time = "0 年";
        }

        String[] str = time.split("\\.");

        int i = Integer.parseInt(str[0]);
        int d = Integer.parseInt(str[1]);
        if (i > 0 && d >= 5) {
            time = str[0] + ".5 年";
        } else if (i > 0 && d < 5) {
            time = str[0] + " 年";
        } else if (i <= 0 && d >= 5) {
            time = "1  年";
        } else {
            time = "0.5 年";
        }
        return time;
    }

    /**
     * yangkai17025
     * 给定时间判断此时间所在周的周一*（周日）
     **/
    public String convertWeekByDate(Date time) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //设置时间格式
        Calendar cal = Calendar.getInstance();
        cal.setTime(time);
        //判断要计算的日期是否是周日，如果是则减一天计算周六的，否则会出问题，计算到下一周去了
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);//获得当前日期是一个星期的第几天
        if (1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        System.out.println("要计算日期为:" + sdf.format(cal.getTime())); //输出要计算日期
        cal.setFirstDayOfWeek(Calendar.MONDAY);//设置一个星期的第一天，按中国的习惯一个星期的第一天是星期一
        int day = cal.get(Calendar.DAY_OF_WEEK);//获得当前日期是一个星期的第几天
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);//根据日历的规则，给当前日期减去星期几与一个星期第一天的差值
        String imptimeBegin = sdf.format(cal.getTime()); // 周一
//        cal.add(Calendar.DATE, 6);
//        String imptimeEnd = sdf.format(cal.getTime());//周天
        return imptimeBegin;
    }

    /**
     * yangkai17025
     **/
    public static class MyDate {
        int day;
        int month;
        int year;
        SimpleDateFormat sdf0 = new SimpleDateFormat("yyyy");
        SimpleDateFormat sdf1 = new SimpleDateFormat("MM");
        SimpleDateFormat sdf2 = new SimpleDateFormat("dd");

        public MyDate(Date d) {
            this.day = Integer.valueOf(sdf2.format(d));
            this.month = Integer.valueOf(sdf1.format(d));
            this.year = Integer.valueOf(sdf0.format(d));
            ;
        }

        public long funtion(MyDate d) {
            int newDay = d.day;
            int newMonth = d.month;
            int newYear = d.year;
            Calendar c1 = Calendar.getInstance();
            c1.set(newYear, newMonth, newDay);
            long n1 = c1.getTimeInMillis();
            Calendar c2 = Calendar.getInstance();
            c2.set(year, month, day);
            long n2 = c2.getTimeInMillis();
            return Math.abs((n1 - n2) / 24 / 3600000);
        }
    }

    /**
     * 两个时间之间的查（天）
     * yangkai17025
     **/
    public static long getDateDiffe(Date a, Date b) {
        MyDate d1 = new MyDate(a);
        MyDate d2 = new MyDate(b);
        return d1.funtion(d2);
    }

    /**
     * 获取本月有多少天）
     * yangkai17025
     **/
    public static int getDateOfMonth() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
        return cal.get(Calendar.DAY_OF_MONTH);
    }

    /**
     * 返回给定时间是周几
     *
     * @throws ParseException
     **/
    public static int getDayForWeek(String pTime) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Calendar c = Calendar.getInstance();
        try {
            c.setTime(format.parse(pTime));
        } catch (ParseException e) {
            log.error("DatetimeUtil.getDayForWeek:" + e.getMessage());
        }
        int dayForWeek = 0;
        if (c.get(Calendar.DAY_OF_WEEK) == 1) {
            dayForWeek = 7;
        } else {
            dayForWeek = c.get(Calendar.DAY_OF_WEEK) - 1;
        }
        return dayForWeek;
    }


    /**
     * 获取给定时间的星期
     *
     * @param time
     * @return
     */
    public static String getWeek(Date time) {
        if (time == null) {
            return null;
        }
        Calendar c = Calendar.getInstance();
        c.setTime(time);
        int week = c.get(Calendar.DAY_OF_WEEK) - 1;
        if (week == 1) {
            return "星期一";
        }
        if (week == 2) {
            return "星期二";
        }
        if (week == 3) {
            return "星期三";
        }
        if (week == 4) {
            return "星期四";
        }
        if (week == 5) {
            return "星期五";
        }
        if (week == 6) {
            return "星期六";
        }
        if (week == 0) {
            return "星期日";
        }
        return null;
    }

    /**
     * 获取当前时间前num天的日期
     *
     * @param num
     * @return
     */
    public static List<String> getDateList(int num) {
        List<String> dateList = new ArrayList<>();
        Calendar c = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        dateList.add(sdf.format(c.getTime()));
        if (num <= 0) {
            return dateList;
        }

        for (int i = 1; i < num; i++) {
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DAY_OF_MONTH, -i);
            dateList.add(sdf.format(calendar.getTime()));
            calendar.clear();
        }
        return dateList;
    }

    /**
     * 给定String返回data
     *
     * @throws ParseException
     **/
    public static Date getDayOfStirng(String pTime) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        return format.parse(pTime);
    }


    /**
     * 给定String返回data
     *
     * @throws ParseException
     **/
    public static Date addMinutes(Date date, int minutes) throws ParseException {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.MINUTE, minutes);
        return calendar.getTime();
    }

    /**
     * 给定String返回data
     *
     * @throws ParseException
     **/
    public static int getMinutes(Date currentDate, Date preDate) {

        long to3 = currentDate.getTime();
        long from3 = preDate.getTime();
        int minutes = (int) ((to3 - from3) / (1000 * 60));
        return minutes;
    }


    public static Date geLastWeekMonday(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getThisWeekMonday(date));
        cal.add(Calendar.DATE, -7);
        return cal.getTime();
    }

    public static Date getThisWeekMonday(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        // 获得当前日期是一个星期的第几天
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
        if (1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        // 设置一个星期的第一天，按中国的习惯一个星期的第一天是星期一
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        // 获得当前日期是一个星期的第几天
        int day = cal.get(Calendar.DAY_OF_WEEK);
        // 根据日历的规则，给当前日期减去星期几与一个星期第一天的差值
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
        return cal.getTime();
    }

    public static Date geLastWeekMonday(Date date, int num) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getThisWeekMonday(date));
        cal.add(Calendar.DATE, -num);
        return cal.getTime();
    }


}
